#include <signal.h> int (*signal(sig, func)(); int sig; значение сигнала int (*func)(); выполняемая функция
Описание.
Функция signal позволяет выбрать из операционной системы один из трех способов обработки сигнала прерывания. Аргумент sig может быть одной из манифестных констант SIGINT или SIGFPE , определеных в <signal.h> . Манифестная константа SIGINT соответствует в MS DOS сигналу прерывания INT 23H . SIGFPE соответствует прерываниям плавающей точки, которые не маскированы, такие как переполнение, деление на ноль, неверная операция. Аргумент func может быть одной из манифестных констант SIG_DFL или SIG_IGN (также определенных в <signal.h> ), или адресом функции. При получении сигнала прерывания принимаемое действие зависит от значения func и является следующим:
ЗНАЧЕНИЕ ЕГО СМЫСЛ SIG_IGN Сигнал прерывания игнорируется. Это значение для SIGFPE не задается, т.к. состояние процесса с плавающей точкой остается неопределенным. SIG_DFL Вызванный процесс завершен; управление передается на уровень команд MS DOS. Все файлы, открытые в процессе, закры- ваются, но буферы не обновляются. Адрес функции Для сигналов SIGINT функции, на которую указывает func, передается аргумент SIGINT и она выполняется. Если функция завершается нормально, прерванный про- цесс возобновляет выполнение с команды, следующей за той, в которой был получен сигнал прерывания. Перед выполнением специфицированной функции значение func устанавливается в SIG_DFL; следующий сигнал прерывания трактуется как и для SIG_DFL, если внешний вызов signal, задающий другое значение прерывания, не определен. Это позволяет пользователю переустанавливать сигналы в вызываемых функциях, если необходимо. Для SIGFPE функциц, на которую указывает func, передаются два аргумента - SIGFPE и це- лый подкод ошибки, FPE-xxx-, и затем она выполняется. (Смотрите include-файл <float.h> для определения подкодов FPE-xxx.) Значение func не переустановится до тех пор, пока не будет получен сигнал прерывания; для выхода из состояния плавающей точки используется setjmp вместе с longjmp (см. пример для функции_fprset). Если функция завершается нормально, прерван- ный процесс возобновляется в неопределенном состоянии плавающей точки.
Возвращаемое значение.
Функция signal возвращает предыдущее значение func . Возвращаемое значение -1 свидетельствует об ошибке и errno устанавливается в EINVAL , определяя неверное значение sig .
Замечание:
В тех child -процессах, которые созданы посредством вызова процедур exec или spawn , установленные сигналы прерываний не сохраняются. Эти сигналы в child-процессе переустанавливаются по умолчанию.
Пример:
#include <stdio.h> #include <signal.h> #include <stdlib.h> #include <process.h> int handler(); main() { if(signal(SIGINT, handler)==(int(*)())-1) { fprintf(stderr,"couldn't set SIGINT\n"); abort(); } . . . } int handler() { char ch; printf("terminate processing? "); scanf("%1c", &ch); if (ch=='y' ::ch=='Y') exit(0); signal(SIGINT, handler); } /* функция signal, вызванная здесь для следующего сигнала прерываний, посылает управление не в ОС, а к handler() */